#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <error.h>
#include <cstring>
using namespace std;

// alarm()相当于 -13号 信号

int g_cnt = 0;
int ret = 0;

void handler(int sig)
{
    std::cout << "get a sig: " << sig << " g_cnt: " << g_cnt << std::endl;

    unsigned int n = alarm(5);
    // 定时器正在运行：如果之前已经设置了一个定时器，并且该定时器还没有到期，那么再次调用 alarm() ，函数时，它会返回上一次设置的定时器剩余的时间。
    // 例如，如果之前设置了 10 秒的定时器，然后在 5 秒后再次调用 alarm()，那么它将返回 5（表示还有 5 秒定时器才会到期）。

    cout << "还剩多少时间: " << n << endl;
    // exit(0);
}

int main()
{
    //设定一个闹钟
    signal(13, handler);//捕获13号信号，正面alarm()发送的是13号信号。

    alarm(5); // 响一次

    while (true)
    {
        g_cnt++; // 纯内存级
    }

    // int cnt = 0;
    // while (true)
    // {
    //     sleep(1);
    //     cout << "cnt : " << cnt++ << ", pid is : " << getpid() << endl; // IO其实很慢
    //     if (cnt == 2)
    //     {
    //         int n = alarm(0); // alarm(0): 取消闹钟
    //         cout << " alarm(0) ret : " << n << endl;
    //     }
    // }
}

// // mykill -9 pid
// int main(int argc, char *argv[])
// {
//     if (argc != 3)
//     {
//         cout << " usage error: " << argv[0] << " -signumber pid" << endl;
//     }

//     pid_t pid = stoi(argv[2]);
//     int sig = stoi(argv[1]);
//     int n = kill(pid, sig);

//     if (n < 0)
//     {
//         cerr << "kill error, " << strerror(errno) << endl;
//     }

//     return 0;
// }

// void handler(int sig)
// {
//     cout << "I get sidnal, the signalnum:  " << sig << endl;
// }
// int main()
// {
//     signal(2, handler); // ignore
//     // 这个自定义行为，只要被设置过就改变了，不需要写入循环当中。被设置的时候，不会触发行为，只有当进程收到信号是，才会产生行为
//     while (1)
//     {
//         cout << "my pid:  " << getpid() << endl;
//         sleep(3);
//     }
//     return 0;
// }
